home *** CD-ROM | disk | FTP | other *** search
- w{
- SEAN PALMER
-
- Using the state-driven approach, I came up With this simplistic
- Avatar/0 interpreter as an example. Do With it as you wish...
-
- by Sean L. Palmer
- Public Domain
- }
-
- Program avtWrite;
- { example to do avatar/0 (FSC-0025) interpretation }
- { could easily be extended to handle /0+ and /1 codes }
-
- Uses
- Crt;
-
- { this part of the Program controls the state-driven part of the display
- handler. }
-
- Var
- saveAdr : Pointer; { where state handler is now }
- c : Char; { Char accessed by state handler }
- b : Byte Absolute c;
-
- Procedure avtWriteCh(c2 : Char); Inline(
- $8F/$06/>C/ { pop Byte ptr [>c] }
- $FF/$1E/>SAVEADR); { call dWord ptr [>saveAdr] }
- { continue where handler l
-
- call this Procedure from StateHandler to
- suspend execution Until next time
- }
-
- Procedure wait; near; Assembler;
- Asm { wait For next Char }
- pop Word ptr saveAdr { save where to continue next time }
- retF { simulate Exit from calling proc }
- end;
-
- {
- a stateHandler Procedure should never ever Exit (only by calling 'wait'),
- shouldn't have any local Variables or parameters, and shouldn't call
- 'wait' With anything on the stack (like from a subroutine).
- This routine is using the caller's stack, so be careful
- }
-
- Var
- avc : Char;
- avb : Byte Absolute avc;
-
- Procedure stateHandler;
- begin
-
- Repeat
-
- Case c of
-
- ^L :
- begin
- ClrScr;
- Textattr := 3;
- end;
-
- ^Y :
- begin
- wait;
- avc := c;
- wait;
- While c <> #0 do
- begin
- dec(c);
- Write(avc);
- end;
- end;
-
- ^V :
- begin
- wait;
- Case c of
-
- ^A :
- begin
- wait;
- Textattr := Byte(c);
- end;
- ^B : Textattr := Textattr or $80;
- ^C : if whereY > 1 then GotoXY(whereX, whereY - 1);
- ^D : if whereY < 25 then GotoXY(whereX, whereY + 1);
- ^E : if whereX > 1 then GotoXY(whereX - 1,whereY);
- ^F : if whereX < 80 then GotoXY(whereX + 1,whereY);
- ^G : clreol;
- ^H :
- begin
- wait;
- avb := b;
- wait;
- GotoXY(b + 1, avb + 1);
- end;
- else
- Write(^V, c);
- end;
- end;
- else
- Write(c);
- end;
- wait;
- Until False;
- end;
-
- Var
- i : Integer;
- Const
- s : String = 'Oh my'^V^D^V^D^V^F^V^A#1'it works'^V^A#4',see?';
- begin {could do something like attach it to Output's InOutFunc...}
- saveAdr := ptr(seg(stateHandler), ofs(stateHandler) + 3); {skip header}
- For i := 1 to length(s) do
- avtWriteCh(s[i]);
- end.